package com.huashi.dealer.modular.controller.store.order;

import cn.dev33.satoken.annotation.SaIgnore;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.huashi.dealer.core.page.PageFactory;
import com.huashi.dealer.core.pojo.CommonResult;
import com.huashi.dealer.modular.business.order.param.StoreOrderListParam;
import com.huashi.dealer.modular.business.order.service.StoreOrderService;
import com.huashi.dealer.modular.business.order.vo.StoreOrderListVo;
import com.huashi.dealer.modular.business.order.vo.StoreOrderDetailVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.http.ResponseEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import java.nio.charset.StandardCharsets;

/**
 * Store端订单管理控制器
 * 对应PHP项目的订单管理功能
 *
 * @author 谭陈强
 * @since 2025-08-15
 */
@Slf4j
@RestController
@RequestMapping("/store/order")
@Tag(name = "Store端订单管理", description = "订单查询、详情、导出等功能")
public class OrderController {

    @Resource
    private StoreOrderService storeOrderService;

    /**
     * 查询订单列表（统一接口）
     * 通过orderType参数区分不同类型的订单：
     * - 不传或传空：全部订单
     * - 1：待发货订单（已付款，未发货，已审核）
     * - 2：待审核订单（订单状态正常，审核状态为初审或复审）
     * - 3：待收货订单（已付款，已发货，已审核）
     * - 4：待付款订单（未付款，订单状态正常）
     * - 5：已完成订单（已收货，订单状态正常）
     * - 6：已取消订单（订单状态为已取消）
     */
    @GetMapping("/list")
    @Operation(summary = "查询订单列表", description = "根据条件查询订单列表，支持多种状态筛选")
    public CommonResult<Page<StoreOrderListVo>> getOrderList(
            @Parameter(description = "查询参数") @Valid StoreOrderListParam param) {
        
        try {
            // 创建分页对象
            Page<StoreOrderListVo> page = PageFactory.defaultPage();

            // 调用服务查询订单列表
            Page<StoreOrderListVo> result = storeOrderService.getOrderList(param, page);
            
            return CommonResult.data(result);
            
        } catch (Exception e) {
            log.error("查询订单列表失败", e);
            return CommonResult.error("查询订单列表失败：" + e.getMessage());
        }
    }

    /**
     * 查询订单详情
     */
    @GetMapping("/detail/{orderId}")
    @Operation(summary = "查询订单详情", description = "根据订单ID查询订单详细信息")
    public CommonResult<StoreOrderDetailVo> getOrderDetail(
            @Parameter(description = "订单ID") @PathVariable Long orderId) {
        
        try {
            StoreOrderDetailVo detail = storeOrderService.getOrderDetail(orderId);
            return CommonResult.data(detail);
            
        } catch (Exception e) {
            log.error("查询订单详情失败，订单ID: {}", orderId, e);
            return CommonResult.error("查询订单详情失败：" + e.getMessage());
        }
    }

    /**
     * 导出订单数据
     * 根据传入参数自动判断导出哪种类型的订单数据
     * 导出逻辑与list接口完全一致，只是返回Excel文件而不是分页数据
     */
    @PostMapping("/export")
    @Operation(summary = "导出订单数据", description = "根据条件导出订单数据到Excel，支持所有界面的导出需求")
    @SaIgnore
    public ResponseEntity<byte[]> exportOrders(
            @Parameter(description = "导出参数，包含orderType等筛选条件") @Valid @RequestBody StoreOrderListParam param) {
        
        try {
            log.info("导出订单数据，参数: {}", param);
            
            // 调用服务导出订单数据
            byte[] excelData = storeOrderService.exportOrders(param);
            
            // 生成文件名
            String fileName = generateExportFileName(param);
            
            // 设置响应头，支持文件下载
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.setContentDispositionFormData("attachment", fileName + ".xlsx");
            headers.setContentLength(excelData.length);
            
            return new ResponseEntity<>(excelData, headers, HttpStatus.OK);
            
        } catch (Exception e) {
            log.error("导出订单数据失败", e);
            // 返回错误信息
            String errorMessage = "导出订单数据失败：" + e.getMessage();
            return new ResponseEntity<>(errorMessage.getBytes(StandardCharsets.UTF_8), 
                HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

    /**
     * 导出订单数据
     * 根据传入参数自动判断导出哪种类型的订单数据
     * 导出逻辑与list接口完全一致，只是返回Excel文件而不是分页数据
     */
    @GetMapping("/exportGet")
    @Operation(summary = "导出订单数据", description = "根据条件导出订单数据到Excel，支持所有界面的导出需求")
    @SaIgnore
    public ResponseEntity<byte[]> exportOrdersGet(
            @Parameter(description = "导出参数，包含orderType等筛选条件")  StoreOrderListParam param) {

        try {
            log.info("导出订单数据，参数: {}", param);

            // 调用服务导出订单数据
            byte[] excelData = storeOrderService.exportOrders(param);

            // 生成文件名
            String fileName = generateExportFileName(param);

            // 设置响应头，支持文件下载
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
            headers.setContentDispositionFormData("attachment", fileName + ".xlsx");
            headers.setContentLength(excelData.length);

            return new ResponseEntity<>(excelData, headers, HttpStatus.OK);

        } catch (Exception e) {
            log.error("导出订单数据失败", e);
            // 返回错误信息
            String errorMessage = "导出订单数据失败：" + e.getMessage();
            return new ResponseEntity<>(errorMessage.getBytes(StandardCharsets.UTF_8),
                    HttpStatus.INTERNAL_SERVER_ERROR);
        }
    }

    /**
     * 生成导出文件名
     */
    private String generateExportFileName(StoreOrderListParam param) {
        StringBuilder fileName = new StringBuilder("order-");
        
        // 根据订单类型添加标识
        if (param.getOrderType() != null) {
            switch (param.getOrderType()) {
                case 1:
                    fileName.append("delivery-");
                    break;
                case 2:
                    fileName.append("audit-");
                    break;
                case 3:
                    fileName.append("receipt-");
                    break;
                case 4:
                    fileName.append("pay-");
                    break;
                case 5:
                    fileName.append("complete-");
                    break;
                case 6:
                    fileName.append("cancel-");
                    break;
                default:
                    fileName.append("all-");
                    break;
            }
        } else {
            fileName.append("all-");
        }
        
        // 添加时间戳
        fileName.append(System.currentTimeMillis());
        
        return fileName.toString();
    }
}
